/*
 * Copyright 2014 Щекотова Ангелина Александровна.
 * Этот файл — часть J4JClientServer Framework
 * J4JClientServer Framework - свободная программа: вы можете перераспространять ее и/или изменять
 * ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде, в каком
 * она была опубликована Фондом свободного программного обеспечения; либо
 * версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 *
 * J4JClientServer Framework распространяется в надежде, что она будет полезной,
 * но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 * или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 * общественной лицензии GNU.
 *
 * Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 * вместе с этой программой. Если это не так, см.
 * <http://www.gnu.org/licenses/>.
 */

package ru.java4java;

import ru.java4java.ClientServerFramework.SocketHandler;
import ru.java4java.ClientServerFramework.SocketHandlerOptions;
import ru.java4java.ClientServerFramework.Server;
import ru.java4java.ClientServerFramework.impl.Packet;
import ru.java4java.ClientServerFramework.interfaces.SocketHandlerListenerAdapter;
import ru.java4java.utils.Config;
import ru.java4java.utils.ArgsUtils;
import org.apache.log4j.Logger;

import java.io.IOException;
import java.net.Socket;

/**<pre>
 * Данный класс является тестовым классом
 * </pre>
 */
public class ServerMain {

    private static final Logger log = Logger.getLogger(ServerMain.class);

    public static void main(String[] args) throws IOException {
        Config.updateConfig(System.getenv());
        Config.updateConfig(ArgsUtils.parseArgs(args));

        Server server = new Server(9797);
        server.setDefaultClientTimeout(5000);

        server.setClientOptionsClass(Options.class);

        Thread thread = new Thread(server);
        thread.start();

        try {
            thread.join();
        } catch (InterruptedException e) {
            log.error("InterruptedException", e);
        }

        System.exit(0);
    }

    public static Packet pingPacket = new Packet(null);

    public static class Options extends SocketHandlerOptions {
        public Options() {
            setPingPacket(pingPacket);
            getSocketHandlerListeners().add(new CliHandlerListener());
        }
    }

    public static class CliHandlerListener extends SocketHandlerListenerAdapter {
        @Override
        public void afterGet(SocketHandler socketHandler) {
            Socket socket = socketHandler.getSocket();
            Packet packet = socketHandler.getIncoming();
            if (packet.getData().length == 0) {
                System.out.println("ping");
            } else {
                String message = new String(packet.getData());
                System.out.println("Address: " + socket.getRemoteSocketAddress());
                System.out.println("Message: " + message);
            }
        }
    }

}
